package org.example.springaop02.aspect;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component;


/**
 * aop的使用步骤:
 * 1.导入aop依赖
 * 2.编写切面aspect
 * 3.编写通知方法
 * 4.指定切入点表达式
 * 5.测试aop动态织入
 */
@Component
@Aspect
public class LogAspect {

    /**
     * 切入点表达式:
     * 全写法:[public] int [org.example.springaop02.calculator.imp.MathCalculatorImp]
     * .add(int,int)[throws ArithmeticException]
     *
     * 省略写法:int add(int ,int)       如果想匹配全部方法: int *(int,int)
     */

    //("execution(int *(int,int))") 这个叫方法签名也是切入点
    @Before("execution(int *(int,int))")    //在方法执行之前
    public void beforeStart(){
        System.out.println("在方法执行之前");
    }
    @AfterReturning("execution(int *(int,int))")  //在方法返回之后(方法正常运行)
    public void afterMethod(){

        System.out.println("在方法返回之后(方法正常运行)");
    }

    @AfterReturning("execution(int *(int,int))") //方法抛出异常后
    public void afterException(){
        System.out.println("方法抛出异常后");
    }

    @After("execution(int *(int,int))")  //方法抛不抛异常都要执行
    public void after(){
        System.out.println("方法抛不抛异常都要执行");
    }



}
